package com.zz.tijian.utils;

import cn.hutool.core.codec.Base64;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTUtil;
import cn.hutool.jwt.JWTValidator;
import cn.hutool.jwt.signers.JWTSignerUtil;
import com.zz.tijian.entity.req.CurrentUserInfo;

import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.Date;

public class JwtTool {
    // 便于联调token有效期设置一个月
    private static final Duration JWT_TOKEN_TTL = Duration.ofMinutes(24 * 60 * 30);
    private static final String PAYLOAD_USER_KEY = "user";
    String secretKey = "your_secret_key";
    private byte[] key;

    public JwtTool() {
        key = secretKey.getBytes(StandardCharsets.UTF_8);
    }

    /**
     * 创建 JWT token
     *
     * @param currentUserId 用户id
     * @param name          用户姓名/昵称
     * @param userType      用户类型
     * @return jwt token
     */
    public String createToken(String currentUserId, String name, int userType) {
        // 名称base64编码，防止token无法解析
        String encodeName = StrUtil.isEmpty(name) ? null : Base64.encode(name, StandardCharsets.UTF_8);
        // 生成jwt
        return JWT.create()
                .setPayload(PAYLOAD_USER_KEY, new CurrentUserInfo(currentUserId, encodeName, userType))
                .setExpiresAt(new Date(System.currentTimeMillis() + JWT_TOKEN_TTL.toMillis()))
                .setKey(key)
                .sign();
    }



    /**
     * 从访问token中获取用户信息
     *
     * @param token 访问token
     * @return 用户信息
     */
    public CurrentUserInfo parseToken(String token) {
        try {
            // 解析JWT
            JWT jwt = JWTUtil.parseToken(token);

            // 验证JWT的有效性和签名，允许1秒偏差
            JWTValidator.of(jwt).validateDate();

            Assert.isTrue(jwt.setKey(key).verify(), "Invalid JWT token");

            // 获取Payload
            JSONObject payload = jwt.getPayload().getClaimsJson();

            // 从Payload中获取用户信息
            JSONObject userPayload = payload.getJSONObject(PAYLOAD_USER_KEY);
            String userId = userPayload.getStr("userId");
            String name = userPayload.getStr("realName");
            Integer userType = userPayload.getInt("userType");

            // 如果姓名不为空，进行Base64解码
            if (StrUtil.isNotBlank(name)) {
                name = Base64.decodeStr(name, StandardCharsets.UTF_8);
            }

            // 构造用户信息对象
            return new CurrentUserInfo(userId, name, userType);
        } catch (Exception e) {
            // 捕获异常并处理
            e.printStackTrace(); // 可以根据实际情况记录日志或者返回null/默认用户信息等
            return null;
        }
    }

    public static void main(String[] args) {
        // 示例密钥
     
        JwtTool jwtTool = new JwtTool();

        // 创建 JWT Token
        String token = jwtTool.createToken("1asdas23", "关asdasd羽", 1);
        System.out.println("Generated Token: " + token);

        // 解析 JWT Token
        CurrentUserInfo currentUserInfo = jwtTool.parseToken(token);
        System.out.println("Parsed Token: " + currentUserInfo);
    }
}
